from typing import Annotated

from fastapi import Depends
from sqlalchemy import create_engine
from sqlmodel import SQLModel, Session

engine = create_engine("sqlite:///database.db", connect_args={"check_same_thread": False})


def create_db_and_tables():
    """
    创建数据库和表格。

    本函数通过SQLModel的metadata属性调用create_all方法来创建数据库和所需的表格。
    这是一个重要的步骤，以确保数据库结构与代码中的模型定义保持同步。
    """
    SQLModel.metadata.create_all(engine)


def get_session():
    """
    生成一个数据库会话对象。

    该函数使用了生成器模式，当调用时，它会创建一个数据库会话并将其返回。
    使用者可以在一个 `with` 语句中使用该函数，以确保数据库会话在使用后能够被正确关闭。

    使用 `yield` 关键字而不是 `return`，使得该函数在保持会话对象存活的同时，能够优雅地管理会话的生命周期。
    当 `with` 语句块被执行完毕后，会话会自动关闭，即使在执行过程中遇到异常也是如此。

    返回:
    - 一个数据库会话对象，该对象在 `with` 语句块的持续时间内保持活动状态。
    """
    with Session(engine) as session:
        yield session


SessionDep = Annotated[Session, Depends(get_session)]
